package com.demo.core.service.base;

import java.util.Date;
import java.util.List;

import com.demo.core.dao.base.support.ResultSearchResult;
import com.demo.core.dao.base.support.SearchArgumentSupport;
import com.demo.core.model.Member;

/**
 * 会员相关服务
 * 
 * @author ryuu.kk
 */
public interface MemberService {

	/**
	 * 保存会员信息
	 * @param member 会员模型
	 * @return 会员ID
	 */
	Long save(Member member);
	
	/**
	 * 存在判断
	 * @param id 主键ID
	 * @return 是否存在
	 */
	boolean exists(Long id);
	
	/**
	 * 删除会员信息
	 * @param memberId 会员ID
	 */
	void delete(Long memberId);
	
	/**
	 * 更新昵称
	 * @param id 会员表ID
	 * @param niceName 昵称
	 */
	void updateNickName(Long id, String niceName);
	
	/**
	 * 会员可用
	 * @param id 外键ID
	 * @param enabled 可用标志
	 */
	void enable(Long id, boolean enabled);
	
	/**
	 * 锁定标志
	 * @param id 外键ID
	 * @param locked 锁定标志
	 */
	void lock(Long id, boolean locked);
	
	/**
	 * 有效标志
	 * @param id 外键ID
	 * @param isValid 有效标志
	 */
	void isValid(Long id, boolean isValid);
	
	/**
	 * 更新有效期限
	 * @param id 外键ID
	 * @param expireDay 有效期限日
	 */
	void expireDay(Long id, Date expireDay);
	/**
	 * 更新最后登录时间
	 * @param id 会员ID
	 * @param lastLoginTime 最后登录时间
	 * @param lastLoginIp 最后登录IP
	 */
	void updateLastLogin(Long id, Date lastLoginTime, String lastLoginIp);
	
	/**
	 * 更新最后登录时间
	 * @param id 会员ID
	 * @param lastLoginTime 最后登录时间
	 * @param lastLoginIp 最后登录IP
	 * @param count 总登录次数
	 */
	void updateCurrentLogin(Long id, Date currentLoginTime, String currentLoginIp, int count);
	
	/**
	 * 查询会员
	 * @param memberId 会员ID
	 * @return 会员对象
	 */
	Member find(Long memberId);
	
	/**
	 * 通过用户名，站点ID查询会员信息
	 * @param userName 用户名
	 * @param siteId 站点ID
	 * @return Member 会员对象
	 */
	Member find(String userName, Long siteId);
	
	/**
	 * 通过用户ID，站点ID查询会员
	 * @param userId 用户ID
	 * @param siteId 站点ID
	 * @return 会员对象
	 */
	Member find(Long userId, Long siteId);
	
	/**
	 * 查找用户加入站点的会员信息
	 * 用户成功登陆后，查询几个站点可用
	 * 服务启动，站点信息将常驻Cache
	 * @param userId 用户ID
	 * @return 会员对象列表
	 */
	List<Member> findJoin(Long userId);
	
	/**
	 * 通过站点id查询站点所有会员
	 * @param siteId 站点ID
	 * @return 会员对象列表
	 */
	List<Member> findList(Long siteId);
	
	/**
	 * 取得会员模型列表
	 * 会员对象存储会员信息和角色信息
	 * @param memberId 会员ID
	 * @return 会员角色对象列表
	 */
	Member query(Long memberId);
	
	/**
	 * 取得会员模型列表
	 * 会员对象存储会员信息和角色信息
	 * @param memberId 会员ID
	 * @param mEnabled 会员是否可用
	 * @param rEnabled 角色是否可用
	 * @return 会员角色对象列表
	 */
	Member query(Long memberId, Boolean mEnabled, Boolean rEnabled);
	
	/**
	 * 通过站点id排序字段分页查询站点的会员
	 * @param siteId 站点ID
	 * @param orderBy 排序字段
	 * @param firstResult 第一条数据位置
	 * @param maxResults 最大检索条数
	 * @return 会员对象列表
	 */
	ResultSearchResult<Member> search(Long siteId, SearchArgumentSupport args);
	
	/**
	 * 通过站点id排序字段分页查询站点的会员
	 * 此方法为与User模型的联合分页查询
	 * @param siteId 站点ID
	 * @param orderBy 排序字段
	 * @param firstResult 第一条数据位置
	 * @param maxResults 最大检索条数
	 * @return 会员对象列表
	 */
	ResultSearchResult<Member> searchUnion(Long siteId, SearchArgumentSupport args);
	
	
}
